package com.zjweu.hkg.WebSocket;

import com.zjweu.hkg.DAO.MessageDAO;
import com.zjweu.hkg.POJO.Message;
import com.zjweu.hkg.Servies.MessageService;
import com.zjweu.hkg.utils.ConstUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.zjweu.hkg.Configuration.SpringBeanContext;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@ServerEndpoint("/im/{userId}/{targetId}")
@Component
@Slf4j
public class ImWsServerEndPoint {


    // 存储每个用户对应的 Session
    private static final Map<String, Session> sessionMap = new HashMap<>();

    /**
     * websocket 建立链接时触发方法
     * @param session 每一个 websocket 的链接 对于服务端都是一个 session
     * @param userId 用户 ID
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId,@PathParam("targetId") String targetId) {
        // 建立连接时，将 session 存入 map 中，以用户 ID 为键
        sessionMap.put(userId, session);
        Session targetSession = sessionMap.get(targetId);
        if (targetSession != null && targetSession.isOpen()) {
            try {
                targetSession.getBasicRemote().sendText("hasRead");
            } catch (IOException e) {
                log.error("发送消息时出错", e);
            }
        }
        System.out.println("用户 " + userId + " 建立聊天链接");
        System.out.println("用户 " + userId + " 的 websocket 已打开");
    }
    public void toldTargetHasRead(int userId,int targetId){

    }
    /**
     * 收到了客户端消息时触发方法
     * @param text 客户端传来的消息内容，格式为 "目标用户ID:消息内容"
     * @param userId 发送消息的用户 ID
     */
    @OnMessage
    public void onMessage(String text, @PathParam("userId") String userId) {
        if(text.equals("")){
            System.out.println("用户"+userId+"的心跳");
            return;
        }

        // 检查是否为关机指令
        if (text.contains("锁屏")) {
            System.out.println("接收到关机指令");
            try {
                // 调用 CMD 命令关机
                Runtime.getRuntime().exec("rundll32.exe user32.dll,LockWorkStation");

            } catch (IOException e) {
                log.error("执行关机命令时出错", e);
            }
            return;
        }

        String[] parts = text.split(":", 2);
        if (parts.length == 2) {
            String targetUserId = parts[0];
            String message = parts[1];
            Message message1 = new Message();
            //如果不是是向自己发送信息
           if(!Objects.equals(userId, targetUserId)){
               Session targetSession = sessionMap.get(targetUserId);
               message1=new Message(message,Integer.parseInt(userId),Integer.parseInt(targetUserId), ConstUtil.MESSAGE_TYPE_TEXT);
               if (targetSession != null && targetSession.isOpen()) {
                   try {
                       targetSession.getBasicRemote().sendText(userId + ": " + message);
                       message1.setIsRead(ConstUtil.MESSAGE_READ_HASREAD);
                       //todo 向客户端发送已读消息
                       Session selfSession = sessionMap.get(userId);
                       if (selfSession != null && selfSession.isOpen()) {
                           selfSession.getBasicRemote().sendText("hasRead");
                       }
                       System.out.println("用户 " + userId + " 向用户 " + targetUserId + " 发送消息：" + message);
                   } catch (IOException e) {
                       log.error("发送消息时出错", e);
                   }
               } else {
                   message1.setIsRead(ConstUtil.MESSAGE_READ_UNREAD);
                   System.out.println("目标用户 " + targetUserId + " 不在线或会话已关闭");
               }
           }


            MessageDAO messageDAO=SpringBeanContext.getContext().getBean(MessageDAO.class);
            messageDAO.insertMessage(message1);
        } else {
            System.out.println("消息格式不正确，应为 目标用户ID:消息内容");
        }
    }

    /**
     * 连接关闭时触发方法
     * @param session 每一个 websocket 的链接 对于服务端都是一个 session
     * @param userId 用户 ID
     */
    @OnClose
    public void onClose(Session session, @PathParam("userId") String userId) {
        sessionMap.remove(userId);
        System.out.println("用户 " + userId + " 的 websocket 已关闭");
    }
}